/**
******************************************************************************
* 文件名程: soft_timer.c 
* 作    者: 东莞邓凯哥---微信:D13631760681
* 功    能: 软件定时器
* 硬    件: PY32F403C_KFB_V0.1
* 说明：
* 软件版本 V1.0.1(2025/2/22 9:02)
******************************************************************************
**/
#include "soft_timer.h"

SOFT_TIMER sptime[TIME_NUM];
/******************************************************************************
**函数信息 : soft_timer_enable(uint16_t timenum,uint16_t delay)  
**功能描述 ：使能软件定时器
**输入参数 ：timenum 定时器编号0-255,delay 延时时间1-65535ms
**输出参数 ：无
**说    明 : 无
******************************************************************************/
void soft_timer_enable(uint16_t timenum,uint16_t delay)
{
	sptime[timenum].start_bit = 1;
	sptime[timenum].set_time = delay;
	if( timenum < TIME_NUM )
	{
		if(sptime[timenum].cur_time < sptime[timenum].set_time)
		{
			sptime[timenum].time_up = 0;
		}else{
			sptime[timenum].time_up = 1;
		}
	}
}
/******************************************************************************
**函数信息 : soft_timer_disble(uint16_t timenum)  
**功能描述 ：关闭软件定时器
**输入参数 ：timenum 定时器编号0-255
**输出参数 ：无
**说    明 : 无
******************************************************************************/
void soft_timer_disble(uint16_t timenum)
{
	if( timenum < TIME_NUM )
	{
		sptime[timenum].cur_time = 0;
		sptime[timenum].time_up = 0;
		sptime[timenum].start_bit = 0;
		sptime[timenum].cb_bit = 0;
	}
}
/******************************************************************************
**函数信息 : soft_timer_process(void)  
**功能描述 ：软件定时器循环
**输入参数 ：无
**输出参数 ：无
**说    明 : 在SysTick_Handler 1ms中断调用
******************************************************************************/
void soft_timer_process(void)
{
	uint16_t timenum;
	for(timenum =0; timenum < TIME_NUM; timenum++)
	{
		if( sptime[timenum].start_bit)
		{
			if( sptime[timenum].cur_time < sptime[timenum].set_time )
			{
				sptime[timenum].cur_time ++;
			}
		}
	}
}



/******************************************************************************
**函数信息 : soft_timer_single(uint16_t timenum,uint16_t delay,callback_func callback)
**功能描述 ：软件定时器单次执行
**输入参数 ：timenum 定时器编号,delay 延时时间,callback 回调
**输出参数 ：无
**说    明 : 时间计时到达后,执行一次回调函数
******************************************************************************/
void soft_timer_single(uint16_t timenum,uint16_t delay,callback_func callback)
{
	soft_timer_enable(timenum,delay);
	if( sptime[timenum].time_up)
	{
		if(sptime[timenum].cb_bit == 0)
		{
			callback();
			sptime[timenum].cb_bit = 1;
		}	
	}
}

/******************************************************************************
**函数信息 : soft_timer_cycle(uint16_t timenum,uint16_t delay,callback_func callback)
**功能描述 ：软件定时器循环执行
**输入参数 ：timenum 定时器编号,delay 延时时间,callback 回调
**输出参数 ：无
**说    明 : 时间计时到达后,重复执行回调函数
******************************************************************************/
void soft_timer_cycle(uint16_t timenum,uint16_t delay,callback_func callback)
{
	soft_timer_enable(timenum,delay);
	if( sptime[timenum].time_up)
	{
		callback();
		sptime[timenum].cur_time = 0;
	}
}